package com.yangyang.androidconnect.util;

import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

public class IpUtilV6 {

    /**
     * 获取首选IPv6地址（全球单播地址优先）
     */
    public static String getLocalIPv6Address() {
        try {
            List<InetAddress> ipv6Addresses = new ArrayList<>();
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();

            while (interfaces.hasMoreElements()) {
                NetworkInterface ni = interfaces.nextElement();
                // 接口级别过滤（与IPv4一致）
                if (!ni.isLoopback() && ni.isUp() && ni.supportsMulticast() && !ni.isVirtual()) {
                    Enumeration<InetAddress> addresses = ni.getInetAddresses();
                    while (addresses.hasMoreElements()) {
                        InetAddress addr = addresses.nextElement();
                        if (addr instanceof Inet6Address && !addr.isLinkLocalAddress()) {
                            ipv6Addresses.add(addr);
                        }
                    }
                }
            }

            // 智能选择最佳IPv6地址
            return selectBestIPv6(ipv6Addresses);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return getFallbackIPv6();
    }


    /**
     * 智能选择最佳IPv6地址
     */
    private static String selectBestIPv6(List<InetAddress> ipv6Addresses) {
        if (ipv6Addresses.isEmpty()) {
            return getFallbackIPv6();
        }

        // 优先级选择策略：
        // 1. 优先全球单播地址（2000::/3）
        // 2. 其次唯一本地地址（FC00::/7）
        // 3. 最后其他地址

        InetAddress globalUnicast = null;
        InetAddress uniqueLocal = null;
        InetAddress other = null;

        for (InetAddress addr : ipv6Addresses) {
            byte[] ipBytes = addr.getAddress();

            // 检查全球单播地址（2000::/3）
            if ((ipBytes[0] & (byte) 0xE0) == (byte) 0x20) { // 001开头
                globalUnicast = addr;
                break; // 找到全球单播地址就立即返回
            }
            // 检查唯一本地地址（FC00::/7）
            else if ((ipBytes[0] & (byte) 0xFE) == (byte) 0xFC) { // 1111 110X
                uniqueLocal = addr;
            } else {
                other = addr;
            }
        }

        // 按优先级返回
        if (globalUnicast != null) {
            return globalUnicast.getHostAddress();
        } else if (uniqueLocal != null) {
            return uniqueLocal.getHostAddress();
        } else if (other != null) {
            return other.getHostAddress();
        } else {
            return getFallbackIPv6();
        }
    }

    /**
     * IPv6回退方案
     */
    private static String getFallbackIPv6() {
        return "::1"; // IPv6回环地址
    }
}
